<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ECMAsctipt入门介绍</title>
</head>
<body>
    <script>
        function* helloWorldGenerator(){
            yield 'hello';
            yield 'world';
            return 'ending';
        }
        var hw = helloWorldGenerator();
        console.log(hw)
        console.log(hw.next())
        console.log(hw.next())
        console.log(hw.next())
        console.log(hw.next())
        
        ///
        console.log('--------')
        function* gen(){
            return 123+456
        }
        console.log(gen().next())

        // var arr = [1,[[2,3],4],[5,6]];
        // var flat = function* (a){
        //     a.forEach(function(item){
        //         if(typeof item !== 'number'){
        //             yield* flat(item);
        //         }else{
        //             yield item;
        //         }
        //     })
        // }
        // for (var f of flat(arr)){
        //     console.log(f);
        // }
        //上边写法会报错，也会产生语法错误，因为forEach方法的参数是一个普通函数，
        //但是里边使用yield表达式（这个函数里面还使用了yield*表达式，详见介绍）

        //修改方法改用for循环
        var arr = [1,[[2,3],4],[5,6]];

        var flat = function* (a){
            var length = a.length;
            for(var i = 0;i<length;i++){
                var item = a[i];
                if(typeof item !== 'number') {
                    yield* flat(item);
                } else {
                    yield item
                }
            }
        }
        for (var f of flat(arr)){
            console.log(f);
        }

        //用Generator函数和for of实现斐波那契数列的例子
        // function* fibonacci(){
        //     let [prev,curr] = [0,1];
        //     for(;;){
        //         yield curr;
        //         [prev,curr] = [curr,prev+curr];
        //     }
        // }

        // for(let n of fibonacci()){
        //     if(n>1000) break;
        //     console.log(n);
        // }

        //基本的斐波那契数列的函数
        function fib(max){
            var t,
                a = 0,
                b = 1,
                arr = [0,1];
                while (arr.length < max){
                    [a,b] = [b,a+b];
                    arr.push(b);
                }
                return arr;
        }

        console.log(fib(5));
        console.log(fib(10));
    </script>
</body>
</html>